package com.twotwoshop.gateway.user.limit;

import cn.hutool.json.JSONUtil;
import com.twotwoshop.domin.common.dtos.ResponseResult;
import com.twotwoshop.domin.common.enums.AppHttpCodeEnum;
import org.springframework.http.MediaType;
import org.springframework.web.server.ServerWebExchange;
import reactor.core.publisher.Mono;

import java.nio.charset.StandardCharsets;

/**
 * 限流处理接口
 */
public interface RateLimitHandler {
    
    /**
     * 处理限流请求
     * @param exchange ServerWebExchange
     * @return Mono<Void>
     *
     *
     * 这是一个限流处理的接口：
     * 使用 default 方法提供默认的限流处理实现
     * ServerWebExchange 包含了当前请求和响应的所有信息
     * 使用 Mono<Void> 返回类型支持响应式编程
     * 默认实现会返回一个 JSON 格式的错误响应，提示"请求太频繁"
     * 设置响应的 Content-Type 为 APPLICATION_JSON
     * DefaultRateLimitHandler 实现类：
     *
     */
    default Mono<Void> handleRateLimit(ServerWebExchange exchange) {
        exchange.getResponse().getHeaders().setContentType(MediaType.APPLICATION_JSON);
        return exchange.getResponse().writeWith(Mono.just(exchange.getResponse()
                .bufferFactory().wrap(
                        JSONUtil.toJsonStr(ResponseResult.errorResult(
                                AppHttpCodeEnum.TOKEN_INVALID,
                                "请求太频繁，请稍后重试"))
                                .getBytes(StandardCharsets.UTF_8)
                )));
    }
}